﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Split
{
	static class AtMark
	{
        static public void Split(ref List<Expression> CodeTokens)
        {
         /************
         * アットマークで更に切り分ける
         ***********/
            int cossss = 0;
            foreach (Expression e in CodeTokens)
            {
                string[] debug = e.TokenList.ToArray();

                int coss = 0;
                int sflag = 0;//Skip用のフラグ
                foreach (string d in debug)
                {

                    if (sflag != 0)//読み取り終わっているものなら
                    {
                        #region debug
#if DEBUG
                        Console.WriteLine("[DebugMessage::SplitStep2::ReadOK]" + d);
#endif
                        #endregion
                        sflag--;
                        continue;
                    }

                    string[] Array = d.Split('@');
                    if (Array.Length >= 2)//二個以上に分割できたら
                    {
                        CodeTokens[cossss].TokenList.RemoveAt(coss);

                        //CodeTokens[cos].TokenList.Insert(coss, "@");//開始のアットマーク

                        bool isFirst = false;//はじめの分割単位が既に挿入されたか
                        int temp = 0;//insert回数

                        foreach (string dd in Array)//分かれたもの
                        {

                            #region debug
#if DEBUG
                            Console.WriteLine("[DebugMessage::SplitStep2::AtMark]" + dd);
#endif
                            #endregion
                            if (dd != "")//空ならアットマーク
                            {
                                CodeTokens[cossss].TokenList.Insert(coss, dd);
                                temp++;
                                if (!isFirst)//未挿入だったら
                                {
                                    isFirst = true;
                                    #region debug
#if DEBUG
                                    Console.WriteLine("[DebugMessage::SplitStep2::FirstInsert]{0}", CodeTokens[cossss].TokenList[coss]);
#endif
#endregion
                                    coss++;
                                }
                                else if (isFirst)
                                {

                                    #region debug
#if DEBUG 
                                    Console.WriteLine("[DebugMessage::SplitStep2::Insert::Expression]{0}", CodeTokens[cossss].TokenList[coss]);
#endif
                                    #endregion
                                }
                            }
                            else if (dd == "")
                            {
                                if (!isFirst) //まだ挿入されていなかったら
                                {
                                    CodeTokens[cossss].TokenList.Insert(coss, "@");
                                    isFirst = true;//挿入済みにする
                                    #region debug
#if DEBUG
                                    Console.WriteLine("[DebugMessage::SplitStep2::FirstInsert]{0}", CodeTokens[cossss].TokenList[coss]);
#endif
                                    #endregion
                                    coss++;
                                }

                                else if (isFirst)//もう挿入されていたら
                                {
                                    CodeTokens[cossss].TokenList.Insert(coss, "@");
                                     #region debug
#if DEBUG
                                    Console.WriteLine("[DebugMessage::SplitStep2::Insert::Expression]{0}", CodeTokens[cossss].TokenList[coss]);
#endif
                                     #endregion
                                }
                            }
                        }
                         #region debug
#if DEBUG
                        Console.WriteLine("[DebugMessage::SplitStep2::WorkFin]OK.");
#endif
                         #endregion

                        //CodeTokens[cos].TokenList.Insert(coss , "@");

                        //sflag+=temp;
                    }
                    coss++;//CodeTokens.TokenListをインクリメントして、次の要素を参照する
                }

                coss = 0;//次のループ用に初期化

                cossss++;//CodeTokensをインクリメント
            }
        }
	}
}
